home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / PROGRAM / INTRFC61.ARJ / BLOCKS.PAS next >
Pascal/Delphi Source File  |  1990-12-19  |  5KB  |  238 lines

  1. unit blocks;
  2.  
  3. interface
  4.  
  5. type
  6.   entry_pt_ptr = ^entry_pt_rec;
  7.   entry_pt_rec = record
  8.     w1,w2 : word;
  9.     code_block, offset : word;
  10.   end;
  11.  
  12.   block_ptr = ^block_rec;
  13.   block_rec = record
  14.     w1,size : word;
  15.     relocbytes,owner : word;
  16.   end;
  17.  
  18.   const_block_ptr = ^const_block_rec;
  19.   const_block_rec = record
  20.     w1,size : word;
  21.     relocbytes,obj_ofs : word;
  22.   end;
  23.  
  24.   vmt_block_ptr = ^vmt_block_rec;
  25.   vmt_block_rec = record
  26.     unitnum,rtype : byte;
  27.     entrynum,w3,vmt_ofs : word;
  28.   end;
  29.  
  30.   unit_block_ptr = ^unit_block_rec;
  31.   unit_block_rec = record
  32.     w1 : word;
  33.     name : string;
  34.   end;
  35.  
  36.   debug_block_ptr = ^debug_block_rec;
  37.   debug_block_rec = record
  38.     obj_ofs, w2, w3, startline, len : word;
  39.     bytes_per_line : array[1..1] of byte;
  40.   end;
  41.  
  42. procedure print_entries;
  43. procedure print_code_blocks;
  44. procedure print_const_blocks;
  45. procedure print_var_blocks;
  46. procedure print_mystery;
  47. procedure print_unit_blocks;
  48.  
  49. function unit_name(ofs:word):string;
  50. procedure write_code_block_name(debug_ofs : word);
  51. procedure write_const_block_name(info_ofs : word);
  52.  
  53. procedure add_referenced_units;
  54.  
  55. implementation
  56.  
  57. uses dump,util,globals,head,loader,namelist,nametype,reloc;
  58.  
  59. procedure print_entries;
  60. var
  61.   block:entry_pt_ptr;
  62.   ofs,limit : word;
  63. begin
  64.   ofs := 0;
  65.   limit := header^.ofs_code_blocks-header^.ofs_entry_pts;
  66.   if ofs<limit then
  67.   begin
  68.     writeln('Entry records');
  69.     writeln('    Proc     Code block:offset');
  70.   end;
  71.   while ofs<limit do
  72.   begin
  73.     block := add_offset(buffer,header^.ofs_entry_pts+ofs);
  74.     writeln(hexword2(ofs):8,
  75.             hexword2(block^.code_block):12,':',hexword(block^.offset));
  76.     inc(ofs,sizeof(block^));
  77.   end;
  78. end;
  79.  
  80. procedure write_code_block_name(debug_ofs : word);
  81. var
  82.   debug : debug_block_ptr;
  83.   obj : obj_ptr;
  84.   info : func_info_ptr;
  85.   parent_info : word;
  86.   parent_obj : obj_ptr;
  87. begin
  88.   if debug_ofs = $FFFF then
  89.     exit;
  90.   debug := add_offset(buffer,header^.ofs_line_lengths+debug_ofs);
  91.   if debug^.obj_ofs = 0 then
  92.     write('Startup code')
  93.   else
  94.   begin
  95.     obj := add_offset(buffer,debug^.obj_ofs);
  96.     if obj^.obj_type = proc_id then
  97.     begin
  98.       info := add_offset(obj,4+length(obj^.name));
  99.       parent_info := info^.parent_ofs;
  100.       if parent_info <> 0 then
  101.       begin
  102.         parent_obj := find_type(unit_list[1],parent_info);
  103.         if parent_obj <> nil then
  104.           write(parent_obj^.name,'.')
  105.         else
  106.           write('obj',hexword(parent_info),'.');
  107.       end;
  108.     end;
  109.     write(obj^.name);
  110.   end;
  111. end;
  112.  
  113. procedure write_const_block_name(info_ofs : word);
  114. var
  115.   obj : obj_ptr;
  116. begin
  117.   if info_ofs = 0 then
  118.     exit;
  119.   obj := find_type(unit_list[1],info_ofs);
  120.   if obj <> nil then
  121.     write(obj^.name)
  122.   else
  123.     write('obj',hexword(info_ofs));
  124. end;
  125.  
  126. procedure print_blocks(blocktype:string; base,limit:word);
  127. var
  128.   ofs : word;
  129.   block : block_ptr;
  130. begin
  131.   writeln;
  132.   ofs := 0;
  133.   if ofs < limit then
  134.   begin
  135.     writeln(blocktype,' blocks');
  136.     writeln('Blocknum   Bytes  Relocrecs   Owner');
  137.   end;
  138.   while ofs < limit do
  139.   begin
  140.     block := add_offset(buffer,base+ofs);
  141.     with block^ do
  142.     begin
  143.       write(hexword2(ofs):8,hexword2(size):8,hexword2(relocbytes):8,
  144.                 hexword2(owner):8,' ');
  145.       if blocktype = 'Code' then
  146.         write_code_block_name(owner)
  147.       else if blocktype = 'Const' then
  148.         write_const_block_name(owner);
  149.       writeln;
  150.       if w1 <> 0 then
  151.         writeln(' w1 = ',hexword(w1));
  152.     end;
  153.     inc(ofs,sizeof(block_rec));
  154.   end;
  155. end;
  156.  
  157. procedure print_code_blocks;
  158. var
  159.   base,limit:word;
  160. begin
  161.   base := header^.ofs_code_blocks;
  162.   limit := header^.ofs_const_blocks - base;
  163.   print_blocks('Code',base,limit);
  164. end;
  165.  
  166. procedure print_const_blocks;
  167. var
  168.   base,limit:word;
  169. begin
  170.   base := header^.ofs_const_blocks;
  171.   limit := header^.ofs_var_blocks - base;
  172.   print_blocks('Const',base,limit);
  173. end;
  174.  
  175. procedure print_var_blocks;
  176. var
  177.   base,limit:word;
  178. begin
  179.   base := header^.ofs_var_blocks;
  180.   limit := header^.ofs_unit_list - base;
  181.   print_blocks('Var',base,limit);
  182. end;
  183.  
  184. procedure print_mystery;
  185. begin
  186.   with header^ do
  187.     if ofs_unit_list > ofs_mystery then
  188.     begin
  189.       writeln;
  190.       writeln(^G'You have a mystery section!  Please see the TPU60.DOC file.');
  191.       writeln('Here''s a dump:');
  192.       dumpbytes(buffer^,ofs_mystery,ofs_unit_list-ofs_mystery);
  193.     end;
  194. end;
  195.  
  196. procedure print_unit_blocks;
  197. var
  198.   base,ofs,limit:word;
  199.   block : unit_block_ptr;
  200. begin
  201.   base := header^.ofs_unit_list;
  202.   ofs := 0;
  203.   limit := header^.ofs_src_name - ofs;
  204.   writeln('Unit list');
  205.   writeln(' Offset    w1     Name');
  206.   while base+ofs < limit do
  207.   begin
  208.     block := add_offset(buffer,base+ofs);
  209.     with block^ do
  210.     begin
  211.       writeln(hexword2(ofs):8,hexword2(w1):8,'  ',name);
  212.       ofs := ofs + 3 + length(name);
  213.     end;
  214.   end;
  215. end;
  216.  
  217. function unit_name(ofs:word):string;
  218. begin
  219.   unit_name := unit_block_ptr(
  220.                 add_offset(buffer,header^.ofs_unit_list+ofs))^.name;
  221. end;
  222.  
  223. procedure add_referenced_units;
  224. var
  225.   block : unit_block_ptr;
  226.   ofs   : word;
  227. begin
  228.   ofs := header^.ofs_unit_list;
  229.   while ofs < header^.ofs_src_name do
  230.   begin
  231.     block := add_offset(buffer,ofs);
  232.     add_unit(block^.name);
  233.     ofs := ofs + 3 + length(block^.name);
  234.   end;
  235. end;
  236.  
  237. end.
  238.